#ifndef __WATER_MACHINE_H__
#define __WATER_MACHINE_H__

#include <stdint.h>
#include <stdbool.h>
#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"


// 紫外灯温度阈值定义
#define UV_LED_HIGH_TEMPERATURE_THRESHOLD    60.0f  // 紫外灯高温阈值(摄氏度)
#define UV_LED_LOW_TEMPERATURE_THRESHOLD     40.0f  // 紫外灯低温阈值(摄氏度)

// 环境温度阈值定义
#define ENVIRONMENT_TEMPERATURE_THRESHOLD    5.0f   // 环境温度阈值(摄氏度)

// 超时时间定义
#define WAIT_START_BUTTON_TIMEOUT            30     // 等待开始按钮超时时间(秒)
#define VALVE_CLOSE_TIMEOUT                  10     // 阀门关闭超时时间(秒)
#define DRAIN_DURATION_THRESHOLD             30     // 泄水持续时间阈值(秒)
#define DRAIN_CLOSE_DURATION_THRESHOLD       5      // 泄水阀关闭持续时间阈值(秒)
#define SETTLEMENT_DISPLAY_DURATION          15     // 结算显示持续时间(秒)
#define MINIMUM_BALANCE_THRESHOLD            2.0f   // 最低余额阈值(元)

// 流量计当量定义 (单位: 升/脉冲)
#define FLOW_METER_PULSES_PER_LITER  100.0f    // 每升对应的脉冲数
#define FLOW_METER_LITERS_PER_PULSE  (1.0f / FLOW_METER_PULSES_PER_LITER)  // 每脉冲对应的升数
// 水价宏定义
#define WATER_PRICE_PER_UNIT  2.0f    // 每单位水量价格（元/升）
#define WATER_PRICE_PER_LITER WATER_PRICE_PER_UNIT  // 每升水价格

// 用户信息结构体
typedef struct {
    uint32_t id;           // 用户ID
    float balance;         // 账户余额
} UserInfo;

// 设备信息结构体
typedef struct {
    uint8_t water_valve_state;       // 取水阀状态 (0:关闭, 1:开启)
    uint8_t drain_valve_state;       // 泄水阀状态 (0:关闭, 1:开启, 2:关闭中)
    uint8_t uv_led_state;            // 紫外灯开关状态 (0:关闭, 1:开启)
    uint8_t uv_led_intensity;        // 紫外灯强度 (0:低档, 1:高档)
    float uv_led_temperature;        // 紫外灯温度
    uint32_t uv_led_work_totalMin;   // 紫外灯单次取水工作时长（分钟），结束取水时读取保存的
    uint8_t device_flooding;         // 设备浸水信息 (0:正常, 1:浸水)
    float environment_temperature;   // 设备环境温度
    uint32_t wait_start_time;        // 等待开始按钮时间
    uint32_t water_valve_close_time; // 取水阀关闭时间
    uint32_t drain_start_time;       // 泄水阀开启时间
    uint32_t drain_close_start_time; // 泄水阀开始关闭时间
    uint32_t settlement_display_time;// 结算显示时间
} DeviceInfo;

// 取水机运行数据结构体
typedef struct {
    uint32_t settlement_time;       // 结算显示时间
    uint32_t pulse_count;           // 流量计脉冲数
    float water_volume;             // 本次取水量
    float water_cost;               // 用水金额
} Run_Water_Struct;

// 模式结构体定义
typedef struct _Mode_Struct {
    void ( *mode_enter ) ( void );
    void ( *mode_run ) ( void );
    void ( *mode_exit ) ( void );
} Mode_Struct;

// 泄水阀状态枚举
typedef enum {
    VALVE_STATE_CLOSE = 0,         // 关闭
    VALVE_STATE_OPEN = 1,           // 开启
    VALVE_STATE_CLOSING = 2         // 关闭中
} DrainValveState;

// 紫外灯强度枚举
typedef enum {
    UV_LED_LOW_INTENSITY = 0,       // 低档
    UV_LED_HIGH_INTENSITY = 1       // 高档
} UVLedIntensity;

// 模式实例声明
extern Mode_Struct *Run_Mode_Now;
extern Mode_Struct Run_Mode_Wait_User_Info, Run_Mode_Wait_Start_Button,
       Run_Mode_Water_Dispensing, Run_Mode_Wait_Valve_Close,
       Run_Mode_Settlement;

// 取水机模式结构体变量
extern Run_Water_Struct Run_Water_Data;

// 全局变量
extern UserInfo current_user;
extern DeviceInfo device_info;

// 模式初始化函数
void Run_Mode_Init ( void );

// 运行模式切换逻辑实现
void Logic_Run_Mode_Switch ( void );

// 各模式初始化函数
void Run_Mode_Wait_User_Info_Init ( void );
void Run_Mode_Wait_Start_Button_Init ( void );
void Run_Mode_Water_Dispensing_Init ( void );
void Run_Mode_Wait_Valve_Close_Init ( void );
void Run_Mode_Settlement_Init ( void );

// 等待用户信息模式函数
void Run_Mode_Wait_User_Info_Enter ( void );
void Run_Mode_Wait_User_Info_Run ( void );
void Run_Mode_Wait_User_Info_Exit ( void );

// 等待开始按钮模式函数
void Run_Mode_Wait_Start_Button_Enter ( void );
void Run_Mode_Wait_Start_Button_Run ( void );
void Run_Mode_Wait_Start_Button_Exit ( void );

// 取水模式函数
void Run_Mode_Water_Dispensing_Enter ( void );
void Run_Mode_Water_Dispensing_Run ( void );
void Run_Mode_Water_Dispensing_Exit ( void );

// 等待阀门关闭模式函数
void Run_Mode_Wait_Valve_Close_Enter ( void );
void Run_Mode_Wait_Valve_Close_Run ( void );
void Run_Mode_Wait_Valve_Close_Exit ( void );

// 结算模式函数
void Run_Mode_Settlement_Enter ( void );
void Run_Mode_Settlement_Run ( void );
void Run_Mode_Settlement_Exit ( void );

// 状态切换函数
void Switch_To_Wait_User_Info_Mode ( void );
void Switch_To_Wait_Start_Button_Mode ( void );
void Switch_To_Water_Dispensing_Mode ( void );
void Switch_To_Wait_Valve_Close_Mode ( void );
void Switch_To_Settlement_Mode ( void );

#endif /* __WATER_MACHINE_H__ */